#ifndef CONTROLMODULEPARAMETERSWIDGET_H
#define CONTROLMODULEPARAMETERSWIDGET_H

#include <QWidget>

// 前向声明
class ScanCameraDevice;

namespace Ui {
class ControlModuleParametersWidget;
}

/**
 * @brief 控制模块参数设置控件类
 * 
 * 该类提供了扫描相机控制模块的参数设置界面，包括扫描档位、MCP增益、阴极门控等参数的配置
 * 通过UI控件直接与ScanCameraDevice交互，实现参数的实时更新和设备控制
 */
class ControlModuleParametersWidget : public QWidget
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param device 扫描相机设备指针，用于直接与设备通信
     * @param parent 父窗口指针
     */
    explicit ControlModuleParametersWidget(ScanCameraDevice* device, QWidget *parent = nullptr);
    
    /**
     * @brief 析构函数
     */
    ~ControlModuleParametersWidget();

    /**
     * @brief 获取当前设备指针
     * @return ScanCameraDevice* 设备指针
     */
    ScanCameraDevice* getDevice() const;

    /**
     * @brief 快门开关
     * @param open true-打开，false-关闭
     */
    void setShutterControl(bool open);

    /**
     * @brief 设置扫描档位
     * @param gear 档位值，1:快组件, 2:中组件, 3:慢组件
     */
    void setScanGear(int gear);
    
    /**
     * @brief 设置增益1值
     * @param value 增益1的值
     */
    void setGain1(int value);
    
    /**
     * @brief 设置增益2值
     * @param value 增益2的值
     */
    void setGain2(int value);
    
    /**
     * @brief 设置阴极门控状态
     * @param enabled 是否启用阴极门控
     */
    void setCathodeGating(uint8_t cathodeGatingMode);
    
    /**
     * @brief 设置延迟时间
     * 更新延迟时间SpinBox控件显示
     * @param time 延迟时间，单位：ns
     */
    void setDelayTime(uint32_t time);
    
    /**
     * @brief 设置脉冲宽度
     * @param width 脉冲宽度，单位：ns
     */
    void setPulseWidth(uint32_t time);

    /**
     * @brief 快门开关
     * @return open true-打开，false-关闭
     */
    bool getShutterControl();

    /**
     * @brief 获取当前扫描档位
     * @return int 档位值，1:快组件, 2:中组件, 3:慢组件
     */
    int getScanGear() const;
    
    /**
     * @brief 获取当前增益1值
     * @return int 增益1的值
     */
    uint16_t getGain1() const;
    
    /**
     * @brief 获取当前增益2值
     * @return int 增益2的值
     */
    uint16_t getGain2() const;
    
    /**
     * @brief 获取阴极门控启用状态
     * @return bool 是否启用阴极门控
     */
    uint8_t getCathodeGatingMode() const;
    
    /**
     * @brief 获取当前延迟时间
     * @return int 延迟时间，单位：nm
     */
    uint32_t getDelayTime() const;
    
    /**
     * @brief 获取当前脉冲宽度
     * @return int 脉冲宽度，单位：nm
     */
    uint32_t getPulseWidth() const;

    /**
     * @brief updateConfig  当配置参数变化时更新UI
     */
    void updateConfig(QVariantMap);

public:
signals:
    /**
     * @brief syncParameters 同步配置参数
     */
    void syncParameters();

private:
    /**
     * @brief 从设备获取参数并更新UI
     * @details 正确使用getParameter方法获取各项参数，包括扫描档位、MCP增益和阴极门控参数
     */
    void fetchParametersFromDevice();
    
    /**
     * @brief 建立与设备的信号槽连接
     * @param device 扫描相机设备指针
     */
    void connectToDevice();
    
    /**
     * @brief 断开与设备的连接
     * @details 清除所有已建立的信号槽连接，避免信号泄露
     */
    void disconnectFromDevice();
public slots:
    /**
     * @brief onSyncParameters 同步配置参数
     */
    void onSyncParameters();
    /**
     * @brief 快门控制开关槽函数
     * @param checked 开关状态
     */
    void onShutterControlToggled(bool checked);
    
    /**
     * @brief 扫描档位下拉框槽函数
     * @param index 选中的索引
     */
    void onScanGearComboBoxChanged(int index);
    
    /**
     * @brief 增益1值改变槽函数
     * @param value 新的增益值
     */
    void onGain1ValueChanged();
    
    /**
     * @brief 增益2值改变槽函数
     * @param value 新的增益值
     */
    void onGain2ValueChanged();
    
    /**
     * @brief 阴极门控开关槽函数
     * @param checked 开关状态
     */
    void onCathodeGatingToggled(bool checked);
    
    /**
     * @brief 外部触发开关槽函数
     * @param checked 开关状态
     */
    void onExternalToggled(bool checked);
    
    /**
     * @brief 延迟时间改变槽函数
     * @param value 新的延迟时间值
     */
    void onDelayTimeValueChanged();
    
    /**
     * @brief 脉冲宽度改变槽函数
     * @param value 新的脉冲宽度值
     */
    void onPulseWidthValueChanged();

signals:

    /**
     * @brief 日志写入信号
     * @param logInfo 日志信息
     * @param logLevel 日志级别（默认0）
     * @param isSave 是否保存到文件（默认false）
     */
    void writeLog(const QString& logInfo,int logLevel=0,bool isSave=false);
private:
    Ui::ControlModuleParametersWidget *ui; ///< UI界面指针
    ScanCameraDevice* m_device; ///< 扫描相机设备指针
};

#endif // CONTROLMODULEPARAMETERSWIDGET_H
